﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Data;

namespace SSPharma.Common
{
    public class LibraryFormatConverter
    {
        #region DatetimeExtension
        /// <summary>
        /// MinDate property
        /// </summary>
        private static readonly DateTime MinDate = new DateTime(1900, 1, 1);

        /// <summary>
        /// MaxDate property
        /// </summary>
        private static readonly DateTime MaxDate = new DateTime(9999, 12, 31, 23, 59, 59, 999);

        public static readonly string FormatDateDDMMYYYY = "dd/MM/yyyy";

        public static readonly string SetStringDateDefault = DateTime.Now.ToString("dd/MM/yyyy");
        public static readonly string SetStringDateTimeDefault = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
        
        public static DateTime ConvertDateTimeToMMDDYYYY(DateTime dateTime)
        {
            return Convert.ToDateTime(String.Format("{0:MM dd yyyy}", dateTime));
        }

        public static string ConvertStringDDMMYYYYToStringYYYYMMDD(string dateTimeDDMMYYYY)
        {
            if(!string.IsNullOrEmpty(dateTimeDDMMYYYY))
            {
            string[] ngaythangnam = dateTimeDDMMYYYY.Split('/');

            string MMDDYYYY = ngaythangnam[2] + "-" + ngaythangnam[1] + "-" + ngaythangnam[0];

            return MMDDYYYY;
            }
            return "";
        }

        public static string ConvertStringMMDDYYYYToStringDDMMYYYY(string stringMMDDYYYY)
        {
            string stringDDMMYYYY;
            try
            {
                string thangngaynamShort = stringMMDDYYYY.Split(' ')[0];
                string[] thangngaynam = thangngaynamShort.Split('/');
                stringDDMMYYYY = thangngaynam[1] + "/" + thangngaynam[0] + "/" + thangngaynam[2];
            }
            catch (Exception)
            {

                stringDDMMYYYY = "";
            }
            return stringDDMMYYYY;
        }

        public static DateTime ConvertStringDDMMYYYYToMMDDYYYY(string dateTimeDDMMYYYY)
        {
            string[] ngaythangnam = dateTimeDDMMYYYY.Split('/');

            string MMDDYYYY = ngaythangnam[1] + "/" + ngaythangnam[0] + "/" + ngaythangnam[2];

            return Convert.ToDateTime(MMDDYYYY);
        }

        public static DateTime ConvertStringDDMMYYYYToYYYYMMDD(string dateTimeDDMMYYYY)
        {
            try
            {
                string[] ngaythangnam = dateTimeDDMMYYYY.Split('/');
                if (ngaythangnam.Length > 2)
                {
                    string MMDDYYYY = ngaythangnam[2] + "-" + ngaythangnam[1] + "-" + ngaythangnam[0];

                    return Convert.ToDateTime(MMDDYYYY);
                }
            }
            catch (Exception)
            {
            }
            return DateTime.MinValue;
        }
        public static DateTime ConvertStringDDMMYYYYHHMMSSToYYYYMMDDHHMMSS(string dateTimeDDMMYYYYHHMMSS)// h is Hour
        {
            try
            {

                string[] DateAndTime = dateTimeDDMMYYYYHHMMSS.Split(' ');
                string[] ngaythangnam = DateAndTime.First().Split('/');
                if (ngaythangnam.Length > 2)
                {
                    string MMDDYYYYHHMMSS = ngaythangnam[2] + "-" + ngaythangnam[1] + "-" + ngaythangnam[0] + " "+ DateAndTime.Last();
                    return Convert.ToDateTime(MMDDYYYYHHMMSS);
                }
            }
            catch (Exception)
            {
            }
            return DateTime.MinValue;
        }
        public static DateTime ConvertStringDDMMYYYYToLastMMDDYYYY(string dateTimeDDMMYYYY)
        {
            string[] ngaythangnam = dateTimeDDMMYYYY.Split('/');

            string MMDDYYYY = ngaythangnam[1] + "/" + ngaythangnam[0] + "/" + ngaythangnam[2] + " 11:59:59 PM";

            return Convert.ToDateTime(MMDDYYYY);
        }

        //chuyển một ngày thành đầu ngày : '02/25/2012 08:09:60 AM' => '02/25/2012 00:00:00 AM'
        public static DateTime ConvertToFirstDate(DateTime dateTime)
        {
            string[] ThangNgayNam = dateTime.ToString().Split('/');

            string Thang = ThangNgayNam[0];
            string Ngay = ThangNgayNam[1];
            string Nam = ThangNgayNam[2].Split(' ')[0];

            string newDateString = Thang + "/" + Ngay + "/" + Nam + " 00:00:00 AM";

            return Convert.ToDateTime(newDateString);
        }

        //chuyển một ngày thành cuối ngày : '02/25/2012 08:09:60 AM' => '02/25/2012 11:59:59 PM'
        public static DateTime ConvertToLastDate(DateTime dateTime)
        {
            string[] ThangNgayNam = dateTime.ToString().Split('/');

            string Thang = ThangNgayNam[0];
            string Ngay = ThangNgayNam[1];
            string Nam = ThangNgayNam[2].Split(' ')[0];

            string newDateString = Thang + "/" + Ngay + "/" + Nam + " 11:59:59 PM";

            return Convert.ToDateTime(newDateString);
        }

        public static string ConvertDayOfWeek(int th) //th : thứ
        {
            if (th == 1) return "Thứ hai";
            if (th == 2) return "Thứ ba";
            if (th == 3) return "Thứ tư";
            if (th == 4) return "Thứ năm";
            if (th == 5) return "Thứ sáu";
            if (th == 6) return "Thứ bảy";
            if (th == 0) return "Chủ nhật";

            return string.Empty;
        }

        public static string ConvertDateTimeToDayOfWeek(DateTime datetime) //datetime : ngày bất kỳ
        {
            int th = Convert.ToInt32(datetime.DayOfWeek);

            if (th == 1) return "Thứ hai";
            if (th == 2) return "Thứ ba";
            if (th == 3) return "Thứ tư";
            if (th == 4) return "Thứ năm";
            if (th == 5) return "Thứ sáu";
            if (th == 6) return "Thứ bảy";
            if (th == 0) return "Chủ nhật";

            return string.Empty;
        }

        //Hàm tính chênh lệch thời gian (theo phút) giữa hai ngày
        public static int MinuteDifference(DateTime datetime1, DateTime datetime2)
        {
            return Math.Abs((datetime1 - datetime2).Minutes);
        }

        //Hàm tính chênh lệch thời gian (theo giờ) giữa hai ngày
        public static int HourDifference(DateTime datetime1, DateTime datetime2)
        {
            return Math.Abs((datetime1 - datetime2).Hours);
        }

        //Hàm tính chênh lệch thời gian (theo giây) giữa hai ngày
        public static int SecondDifference(DateTime datetime1, DateTime datetime2)
        {
            return Math.Abs((datetime1 - datetime2).Seconds);
        }
        #endregion

        #region đọc số ra chữ

        /// <summary>
        ///
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string ConvertNumberToString(double number)
        {
            string s = ((int)number).ToString("#");
            string[] so = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
            string[] hang = new string[] { "", "nghìn", "triệu", "tỷ" };
            int i, j, donvi, chuc, tram;
            string str = " ";
            bool booAm = false;
            double decS = 0;

            try
            {
                decS = Convert.ToDouble(s.ToString());
            }
            catch
            {
            }
            if (decS < 0)
            {
                decS = -decS;
                s = decS.ToString();
                booAm = true;
            }
            i = s.Length;
            if (i == 0)
                str = so[0] + str;
            else
            {
                j = 0;
                while (i > 0)
                {
                    donvi = Convert.ToInt32(s.Substring(i - 1, 1));
                    i--;
                    if (i > 0)
                        chuc = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        chuc = -1;
                    i--;
                    if (i > 0)
                        tram = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        tram = -1;
                    i--;
                    if ((donvi > 0) || (chuc > 0) || (tram > 0) || (j == 3))
                        str = hang[j] + str;
                    j++;
                    if (j > 3) j = 1;
                    if ((donvi == 1) && (chuc > 1))
                        str = "một " + str;
                    else
                    {
                        if ((donvi == 5) && (chuc > 0))
                            str = "lăm " + str;
                        else if (donvi > 0)
                            str = so[donvi] + " " + str;
                    }
                    if (chuc < 0)
                        break;
                    else
                    {
                        if ((chuc == 0) && (donvi > 0)) str = "lẻ " + str;
                        if (chuc == 1) str = "mười " + str;
                        if (chuc > 1) str = so[chuc] + " mươi " + str;
                    }
                    if (tram < 0) break;
                    else
                    {
                        if ((tram > 0) || (chuc > 0) || (donvi > 0)) str = so[tram] + " trăm " + str;
                    }
                    str = " " + str;
                }
            }
            if (booAm) str = "Âm " + str;
            return str;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="number"></param>
        /// <param name="datatable"></param>
        /// <returns></returns>
        public static string ConvertNumberToString(double number, DataTable datatable)
        {
            try
            {
                string donvitien = datatable.Rows[0]["DVT_Name"] != null ? datatable.Rows[0]["DVT_Name"].ToString() : "đồng";
                string tiento = !string.IsNullOrEmpty(datatable.Rows[0]["TienTo"].ToString()) ? datatable.Rows[0]["TienTo"].ToString() : ".";
                bool realdecimal = !string.IsNullOrEmpty(datatable.Rows[0]["ReadDecimal"].ToString()) ? (bool)datatable.Rows[0]["ReadDecimal"] : false;

                #region Đọc phần nguyên
                string s = ((int)number).ToString("#");
                string[] so = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
                string[] hang = new string[] { "", "nghìn", "triệu", "tỷ" };
                int i, j, donvi, chuc, tram;
                string str = " ";
                bool booAm = false;
                double decS = 0;

                try
                {
                    decS = Convert.ToDouble(s.ToString());
                }
                catch
                {
                }
                if (decS < 0)
                {
                    decS = -decS;
                    s = decS.ToString();
                    booAm = true;
                }
                i = s.Length;
                if (i == 0)
                    str = so[0] + str;
                else
                {
                    j = 0;
                    while (i > 0)
                    {
                        donvi = Convert.ToInt32(s.Substring(i - 1, 1));
                        i--;
                        if (i > 0)
                            chuc = Convert.ToInt32(s.Substring(i - 1, 1));
                        else
                            chuc = -1;
                        i--;
                        if (i > 0)
                            tram = Convert.ToInt32(s.Substring(i - 1, 1));
                        else
                            tram = -1;
                        i--;
                        if ((donvi > 0) || (chuc > 0) || (tram > 0) || (j == 3))
                            str = hang[j] + str;
                        j++;
                        if (j > 3) j = 1;
                        if ((donvi == 1) && (chuc > 1))
                            str = "mốt " + str;
                        else
                        {
                            if ((donvi == 5) && (chuc > 0))
                                str = "lăm " + str;
                            else if (donvi > 0)
                                str = so[donvi] + " " + str;
                        }
                        if (chuc < 0)
                            break;
                        else
                        {
                            if ((chuc == 0) && (donvi > 0)) str = "lẻ " + str;
                            if (chuc == 1) str = "mười " + str;
                            if (chuc > 1) str = so[chuc] + " mươi " + str;
                        }
                        if (tram < 0) break;
                        else
                        {
                            if ((tram > 0) || (chuc > 0) || (donvi > 0)) str = so[tram] + " trăm " + str;
                        }
                        str = " " + str;
                    }
                }
                if (booAm) str = "Âm " + str;

                #endregion

                if (!string.IsNullOrEmpty(str))
                { str = str.First().ToString().ToUpper() + string.Join("", str.Skip(1)).Trim(); }
                if (number % 1 != 0 && realdecimal)
                {
                    #region Dọc phần thập phân
                    double PhanDu = Math.Round(number % 1, 4);
                    PhanDu = PhanDu < 0 ? PhanDu * (-1) : PhanDu;
                    string resultdecimal = string.Empty;
                    str += " " + donvitien;
                    i = 0;
                    foreach (DataRow dr in datatable.Rows)
                    {
                        if (dr["Levels"] != null && !dr["Levels"].ToString().Equals("0"))
                        {
                            int dvqd = dr["DVQD"] != null ? Convert.ToInt32(dr["DVQD"]) : 0;
                            if (dvqd != 0)
                            {
                                int s2 = 0;
                                s2 = (int)(PhanDu * (double)dvqd);
                                if (s2 != 0)
                                    resultdecimal += ConvertNumberToString(s2).Trim() + " " + dr["DVTCon_Name"] + " ";
                                PhanDu = Math.Round(PhanDu - (s2 / (double)dvqd), 4);
                                if (PhanDu == 0)
                                    break;
                            }
                            i++;
                        }
                    }
                    if (PhanDu != 0)
                    {
                        double phanthunumber = Convert.ToDouble(PhanDu.ToString().Split('.').Last().Substring(i, PhanDu.ToString().Split('.').Last().Length - i));
                        string strphanthua = ConvertNumberToString(phanthunumber);
                        return (str + " " + resultdecimal).Trim() + " lẻ " + strphanthua.Trim();
                    }
                    return (str + " " + resultdecimal).Trim();
                    #endregion
                }
                else
                    return str + " " + donvitien + " " + tiento;
            }
            catch (Exception ex) { return ex.Message; }
        }
        #endregion
    }
}
